package fr.afcepf.atod16.groupe1.projet2.dao;

import fr.afcepf.atod16.groupe1.projet2.dto.Dto;
import fr.afcepf.atod16.groupe1.projet2.dto.DtoCommandeStock;
import fr.afcepf.atod16.groupe1.projet2.dto.DtoLigneCommandeStock;
import fr.afcepf.atod16.groupe1.projet2.dto.DtoProduitStock;
import fr.afcepf.atod16.groupe1.projet2.entities.CommandeStock;
import fr.afcepf.atod16.groupe1.projet2.entities.Entite;
import fr.afcepf.atod16.groupe1.projet2.entities.LigneCommandeStock;
import fr.afcepf.atod16.groupe1.projet2.entities.ProduitStock;

/**
 * Utilitaire assembleur pour la DAO :<br/>
 * - creation de DTO à partir des entity remontés de la couche de persistance (variables + ManyToOne)<br/>
 * - creation d'entity à partir de DTO pour la creation de nouveaux enregistrements (variables)<br/>
 * - mise à jour d'une entity à partir d'un dto
 * @author cedric
 */
public class DaoAssembleur {

    /**
     * Version générique de la création d'un DTO à partir d'une entité :
     * sous-traite le traitement à la fonction adéquate. 
     * @param entite L'entité à convertir
     * @return Le DTO correspondant
     */
    public static Dto createDto(Entite entite){
        if(entite.getClass().getSimpleName().equals("ProduitStock")) {
            return (DtoProduitStock) DaoAssembleur.createDto((ProduitStock) entite);
        }
        else if(entite.getClass().getSimpleName().equals("CommandeStock")) {
            return (DtoCommandeStock) DaoAssembleur.createDto((CommandeStock) entite);
        }
        else if(entite.getClass().getSimpleName().equals("LigneCommandeStock")) {
            return (DtoLigneCommandeStock) DaoAssembleur.createDto((LigneCommandeStock) entite);
        }
        else {
            return null;
        }
    }
    
    /**
     * Version générique de la création d'une entité à partir d'un DTO :
     * sous-traite le traitement à la fonction adéquate. 
     * @param dto Le DTO à convertir
     * @return L'entité correspondante
     */
    public static Entite createEntity(Dto dto) {
        if(dto.getClass().getSimpleName().equals("DtoProduitStock")) {
            return (ProduitStock) DaoAssembleur.createEntity((DtoProduitStock) dto);
        }
        else if(dto.getClass().getSimpleName().equals("DtoCommandeStock")) {
            return (CommandeStock) DaoAssembleur.createEntity((DtoCommandeStock) dto);
        }
        else if(dto.getClass().getSimpleName().equals("DtoLigneCommandeStock")) {
            return (LigneCommandeStock) DaoAssembleur.createEntity((DtoLigneCommandeStock) dto);
        }
        else {
            return null;
        }
    }
    
    /**
     * Version générique de la mise à jour d'une entité avec les informations 
     * d'un DTO : sous-traite le traitement à la fonction adéquate.
     * @param entite L'entité à mettre à jour
     * @param dto Le DTO contenant les informations pour la mise à jour
     */
    public static void updateEntity(Entite entite, Dto dto) {
        if(entite.getClass().getSimpleName().equals("ProduitStock")) {
            DaoAssembleur.updateEntity((ProduitStock) entite, (DtoProduitStock) dto);
        }
        else if(entite.getClass().getSimpleName().equals("CommandeStock")) {
            DaoAssembleur.updateEntity((CommandeStock) entite, (DtoCommandeStock) dto);
        }
        else if(entite.getClass().getSimpleName().equals("LigneCommandeStock")) {
            DaoAssembleur.updateEntity((LigneCommandeStock) entite, (DtoLigneCommandeStock) dto);
        }
    }
    
    /**
     * Permet de convertir une entité ProduitStock en DtoProduitStock
     * @param produit L'entité
     * @return Le DTO
     */
    public static DtoProduitStock createDto(ProduitStock produit) {
        DtoProduitStock dto = new DtoProduitStock();
        dto.setCodeEAN13(produit.getCodeEAN13());
        dto.setDateCreation(produit.getDateCreation());
        dto.setId(produit.getId());
        dto.setStock(produit.getStock());
        dto.setActif(produit.getActif());
        return dto;
    }

    /**
     * Permet de convertir un DtoProduitStock en entité ProduitStock
     * @param produit Le DTO
     * @return L'entité
     */
    public static ProduitStock createEntity(DtoProduitStock produit) {
        ProduitStock entity = new ProduitStock();
        entity.setCodeEAN13(produit.getCodeEAN13());
        entity.setDateCreation(produit.getDateCreation());
        entity.setId(produit.getId());
        entity.setStock(produit.getStock());
        entity.setActif(produit.getActif());
        return entity;
    }

    /**
     * Met à jour une entité ProduitStock grace aux informations d'un DtoProduitStock
     * @param entity L'entite
     * @param produit Le DTO
     */
    public static void updateEntity(ProduitStock entity, DtoProduitStock produit) {
        entity.setCodeEAN13(produit.getCodeEAN13());
        entity.setDateCreation(produit.getDateCreation());
        entity.setId(produit.getId());
        entity.setStock(produit.getStock());
        entity.setActif(produit.getActif());
    }

    /**
     * Permet de convertir une entité CommandeStock en DtoCommandeStock
     * @param commande L'entité
     * @return Le DTO
     */
    public static DtoCommandeStock createDto(CommandeStock commande) {
        DtoCommandeStock dto = new DtoCommandeStock();
        dto.setAdresseLivraison(commande.getAdresseLivraison());
        dto.setCiviliteLivraison(commande.getCiviliteLivraison());
        dto.setCodePostalLivraison(commande.getCodePostalLivraison());
        dto.setDateCreation(commande.getDateCreation());
        dto.setDateLivraison(commande.getDateLivraison());
        dto.setEtatLivraison(commande.getEtatLivraison());
        dto.setId(commande.getId());
        dto.setIdSite(commande.getIdSite());
        dto.setModeLivraison(commande.getModeLivraison());
        dto.setNomLivraison(commande.getNomLivraison());
        dto.setPrenomLivraison(commande.getPrenomLivraison());
        dto.setTelFixeLivraison(commande.getTelFixeLivraison());
        dto.setTelMobileLivraison(commande.getTelMobileLivraison());
        dto.setVilleLivraison(commande.getVilleLivraison());
        return dto;
    }

    /**
     * Permet de convertir un DtoCommandeStock en une entité CommandeStock
     * @param commande Le DTO
     * @return L'entité
     */
    public static CommandeStock createEntity(DtoCommandeStock commande) {
        CommandeStock entity = new CommandeStock();
        entity.setAdresseLivraison(commande.getAdresseLivraison());
        entity.setCiviliteLivraison(commande.getCiviliteLivraison());
        entity.setCodePostalLivraison(commande.getCodePostalLivraison());
        entity.setDateCreation(commande.getDateCreation());
        entity.setDateLivraison(commande.getDateLivraison());
        entity.setEtatLivraison(commande.getEtatLivraison());
        entity.setId(commande.getId());
        entity.setIdSite(commande.getIdSite());
        entity.setModeLivraison(commande.getModeLivraison());
        entity.setNomLivraison(commande.getNomLivraison());
        entity.setPrenomLivraison(commande.getPrenomLivraison());
        entity.setTelFixeLivraison(commande.getTelFixeLivraison());
        entity.setTelMobileLivraison(commande.getTelMobileLivraison());
        entity.setVilleLivraison(commande.getVilleLivraison());
        return entity;
    }

    /**
     * Met à jour une entité CommandeStock grace aux informations d'un DtoCommandeStock
     * @param entity L'entité
     * @param commande Le DTO
     */
    public static void updateEntity(CommandeStock entity, DtoCommandeStock commande) {
        entity.setAdresseLivraison(commande.getAdresseLivraison());
        entity.setCiviliteLivraison(commande.getCiviliteLivraison());
        entity.setCodePostalLivraison(commande.getCodePostalLivraison());
        entity.setDateCreation(commande.getDateCreation());
        entity.setDateLivraison(commande.getDateLivraison());
        entity.setEtatLivraison(commande.getEtatLivraison());
        entity.setId(commande.getId());
        entity.setIdSite(commande.getIdSite());
        entity.setModeLivraison(commande.getModeLivraison());
        entity.setNomLivraison(commande.getNomLivraison());
        entity.setPrenomLivraison(commande.getPrenomLivraison());
        entity.setTelFixeLivraison(commande.getTelFixeLivraison());
        entity.setTelMobileLivraison(commande.getTelMobileLivraison());
        entity.setVilleLivraison(commande.getVilleLivraison());
    }

    /**
     * Permet de convertir une entité LigneCommandeStock en un DtoLigneCommandeStock
     * @param ligneCommande L'entité
     * @return Le DTO
     */
    public static DtoLigneCommandeStock createDto(LigneCommandeStock ligneCommande) {
        DtoLigneCommandeStock dto = new DtoLigneCommandeStock();
        if (ligneCommande.getCommande() != null) {
            dto.setCommande(DaoAssembleur.createDto(ligneCommande.getCommande()));
        }
        dto.setId(ligneCommande.getId());
        if (ligneCommande.getProduit() != null) {
            dto.setProduit(DaoAssembleur.createDto(ligneCommande.getProduit()));
        }
        dto.setQuantite(ligneCommande.getQuantite());
        return dto;
    }

    /**
     * Permet de convertir un DtoLigneCommandeStock en une entité LigneCommandeStock
     * @param ligneCommande Le DTO
     * @return L'entité
     */
    public static LigneCommandeStock createEntity(DtoLigneCommandeStock ligneCommande) {
        LigneCommandeStock entity = new LigneCommandeStock();
        entity.setId(ligneCommande.getId());
        entity.setQuantite(ligneCommande.getQuantite());
        return entity;
    }

    /**
     * Met à jour une entité LigneCommandeStock grace aux informations
     * d'un DtoLigneCommandeStock
     * @param entity L'entité
     * @param ligneCommande Le DTO
     */
    public static void updateEntity(LigneCommandeStock entity, DtoLigneCommandeStock ligneCommande) {
        entity.setId(ligneCommande.getId());
        entity.setQuantite(ligneCommande.getQuantite());
    }
}
